package  
{
	import adobe.utils.CustomActions;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	/**
	 * ...
	 * @author Luis Felipe
	 */
	public class Main extends MovieClip
	{
		public static var personagem : Personagem;
		
		var cenario : Cenario;
		
		var hud : Hud;
		
		var tiro : Tiro;
		var contaTiros : int;
		var AR_tiros : Array;
		
		var tiroInimigo : TiroInimigo;
		var AR_tirosIni : Array;
		
		var inimigo : Inimigo;
		var AR_inimigos : Array;
		var inimigoDelay : int;
		
		var menu : Menu;
		
		var fase : int;
		
		public function Main() 
		{
			contaTiros = 0;
			
			inimigoDelay = 0;
			
			AR_tiros = [];
			
			AR_inimigos = [];
			
			AR_tirosIni = [];
			
			fase = 1;
			
			desenharMenu();
			
		}
		
		public function update(e:Event):void
		{
			limitarTela();
			criarTiro();
			criarInimigo();
			criarTiroInimigo();
			passarFase();
			moverTela();
			colisaoTiro();
			removerTiro();
			removerInimigo();
			//gameOver();
		}
		
		public function desenharTela():void
		{
			cenario = new Cenario(fase);
			cenario.x = 0;
			cenario.y = 0;
			addChild(cenario);
			
			personagem = new Personagem(cenario.AR_pisos);
			personagem.x = stage.stageWidth / 4;
			personagem.y = stage.stageHeight / 8;
			addChild(personagem);
			
			hud = new Hud();
			hud.x = 0;
			hud.y = 0;
			addChild(hud);
			
			stage.focus = stage;
			
			addEventListener(Event.ENTER_FRAME, update);
			//menu.btIniciar.removeEventListener(MouseEvent.CLICK, iniciarJogo);
		}
		
		public function desenharMenu():void
		{
			menu = new Menu();
			menu.x = stage.stageWidth / 2;
			menu.y = stage.stageHeight / 2;
			addChild(menu);
			
			menu.btIniciar.addEventListener(MouseEvent.CLICK, iniciarJogo);
			//removeEventListener(Event.ENTER_FRAME, update);
		}
		
		public function iniciarJogo(e:MouseEvent):void
		{
			removeChild(menu);
			menu = null;
			
			desenharTela();
			
		}
		
		public function limitarTela():void
		{
			if (personagem.x <= personagem.width/2 )
			{
				personagem.x = personagem.width/2;
			}
			if (personagem.x >= stage.stageWidth - personagem.width/2)
			{
				personagem.x = stage.stageWidth - personagem.width/2;
			}
		}
		
		public function criarTiro():void
		{
			contaTiros++;
			if (contaTiros >= 3)
			{
				contaTiros = 3;
				
				if (personagem.espaco == true)
				{
					tiro = new Tiro(personagem.direcao);
					if (personagem.direcao == "direita")
					{
						tiro.x = personagem.x + personagem.width /2 + tiro.width/2
					}
					else if (personagem.direcao == "esquerda")
					{
						tiro.x = personagem.x - personagem.width /2 - tiro.width/2
					}
					tiro.y = personagem.y;
					addChild(tiro);
					AR_tiros.push(tiro);
					contaTiros = 0;
				}
			}
		}
		
		public function criarTiroInimigo():void
		{
			for (var i : int = 0; i < AR_inimigos.length; i++)
			{
				if (AR_inimigos[i].podeAtirar == true)
				{
					tiroInimigo = new TiroInimigo(AR_inimigos[i].direcao);
					if (AR_inimigos[i].direcao == "direita")
					{
						tiroInimigo.x = AR_inimigos[i].x + AR_inimigos[i].width /2 + tiroInimigo.width/2
					}
					else if (AR_inimigos[i].direcao == "esquerda")
					{
						tiroInimigo.x = AR_inimigos[i].x - AR_inimigos[i].width /2 - tiroInimigo.width/2
					}
					tiroInimigo.y = AR_inimigos[i].y;
					addChild(tiroInimigo);
					AR_tirosIni.push(tiroInimigo);
				}
			}
		}
		
		public function criarInimigo():void
		{
			inimigoDelay++;
			if (inimigoDelay >= 72)
			{
				inimigo = new Inimigo(cenario.AR_pisos);
				inimigo.x = Math.random() * stage.stageWidth;
				inimigo.y = - inimigo.height / 2;
				addChild(inimigo);
				AR_inimigos.push(inimigo);
				
				inimigoDelay = 0;
			}
		}
		
		public function removerTiro():void
		{
			for (var i : int = 0; i < AR_tiros.length; i++)
			if (AR_tiros[i].x >= stage.stageWidth || AR_tiros[i].x <= 0)
			{
				removeChild(AR_tiros[i]);
				AR_tiros.splice(i, 1);
			}
			
			for (i = 0; i < AR_tirosIni.length; i++)
			if (AR_tirosIni[i].x >= stage.stageWidth || AR_tirosIni[i].x <= 0)
			{
				removeChild(AR_tirosIni[i]);
				AR_tirosIni.splice(i, 1);
			}
		}
		
		public function removerInimigo():void
		{
			for (var i : int = 0; i < AR_inimigos.length; i++)
			{
				if (AR_inimigos[i].y >= stage.stageHeight + AR_inimigos[i].height / 2)
				{
					removeChild(AR_inimigos[i]);
					AR_inimigos.splice(i, 1);
				}
			}
		}
		
		public function removerTela():void
		{
			removeChild(cenario);
			cenario = null;
			
			removeChild(personagem);
			personagem = null;
			
			removeChild(hud);
			hud = null;
			
			if (inimigo != null)
			{
				for (var i : int = 0; i < AR_inimigos.length; i++)
				{
					removeChild(AR_inimigos[i]);
					
				}
				AR_inimigos.splice(0, AR_inimigos.length);
				inimigo = null;
			}
			
			if (tiro != null)
			{
				for (i = 0; i < AR_tiros.length; i++)
				{
					removeChild( AR_tiros[i]);
				}
				AR_tiros.splice(0, AR_tiros.length);
				tiro = null;	
			}
			
			if (tiroInimigo != null)
			{
				for (i = 0; i < AR_tirosIni.length; i++)
				{
					removeChild( AR_tirosIni[i]);
				}
				AR_tirosIni.splice(0, AR_tirosIni.length);
				tiroInimigo = null;	
			}
		}
		
		public function passarFase():void
		{
			if (hud.numPontos >= 10*fase)
			{
				removerTela();
				
				fase++;
				
				desenharTela();
			}
		}
		
		public function moverTela():void
		{
			hud.parent.setChildIndex(hud, numChildren - 1);
			
			if (personagem.x >= stage.stageWidth / 2 && personagem.direita == true && cenario.x > stage.stageWidth - cenario.width)
			{
				cenario.x -= 10;
				personagem.x = stage.stageWidth / 2;
				if (inimigo != null)
				{
					for (var i : int = 0; i < AR_inimigos.length; i++)
					{
						AR_inimigos[i].x -= 10;
					}
				}
				
			}
			
			else if (personagem.x <= stage.stageWidth / 2 && personagem.esquerda == true && cenario.x < 0)
			{
				cenario.x += 10;
				personagem.x = stage.stageWidth / 2;
				if (inimigo != null)
				{
					for (i = 0; i < AR_inimigos.length; i++)
					{
						AR_inimigos[i].x += 10;
					}
				}
			}
		}
		
		public function colisaoTiro():void
		{
			if (inimigo != null && tiro != null)
			{
				for (var i : int = 0; i < AR_inimigos.length; i++)
				{
					for (var u : int = 0; u < AR_tiros.length; u++)
					{
						if (AR_inimigos[i].hitTestObject(AR_tiros[u]))
						{
							removeChild(AR_inimigos[i]);
							AR_inimigos.splice(i, 1);
							
							removeChild(AR_tiros[u]);
							AR_tiros.splice(u, 1);
							
							hud.numPontos += 10;
							
							return;
						}
					}
				}
			}
			
			if (tiroInimigo != null)
			{
				for (i = 0; i < AR_tirosIni.length; i++)
				{
					if (AR_tirosIni[i].hitTestObject(personagem))
					{
						personagem.vida--;
						hud.vidaAtual--;
						
						removeChild(AR_tirosIni[i]);
						AR_tirosIni.splice(i, 1);
					}
				}
			}
		}
		
		public function gameOver():void
		{
			if (personagem.vida <= 0 || personagem.y >= stage.stageHeight + personagem.height / 2)
			{
				removerTela();
				
				desenharMenu();
				
				fase = 1;
				
				removeEventListener(Event.ENTER_FRAME, update);
				
			}
		}
	}

}